package net.gxnun.xiaoyuan.core.business.share;

import java.util.HashMap;
import java.util.Map;

/**
 * 用户Session管理器
 * @author yesheng
 *  单例，通过getInstance()方法获取实例。
 */
public class SessionManager {
    
    private static SessionManager instance;
    
    private SessionManager(){}
    
    public static SessionManager getInstance(){
        if(instance == null){
            instance = new SessionManager();
        }
        return instance;
    }
    
    //会话过时时间默认为30分钟
    private static final int SESSION_TIME_OUT = 30;
    
    //缓存会话的map，key是用户的id
    private Map<String,UserSession> map = new HashMap<String,UserSession>();
    
    /**
     * 通过用户ID拿到对应的Session
     * 如果不存在，则创建一个新的Session
     * 每次调用此方法，都要进行时间判断，如果会话过时了，则直接删除
     * @param userId
     * @return
     */
    public UserSession getSession(String userId){
        UserSession session = map.get(userId);
        
        //如果会话已存在,则判断会话是否过期
        if(session!=null){
            Long lateTime = (Long)session.getAttribute("lateTime");
            //如果大于30分钟，则会话过期
            if(System.currentTimeMillis()-lateTime>SESSION_TIME_OUT*60*1000){
                map.remove(userId);
                session = null;
            }
        }
        //如果会话不存在，则创建会话
        else{
            session = new UserSession();
            session.setAttribute("url", "default");
        }
        
        session.setAttribute("lateTime", System.currentTimeMillis());
        
        return session;
    }
    
    /**
     * 清除所有超时会话
     */
    public void clearTimeOutSession(){
        for(String key : map.keySet()){
            UserSession session = map.get(key);
            Long lateTime = (Long)session.getAttribute("lateTime");
            if(System.currentTimeMillis()-lateTime>SESSION_TIME_OUT*60*1000){
                map.remove(key);
                session = null;
            }
        }
    }
    
}
